use std::{env::{self}, process};
use minigrep::Config;

fn main() {
    let args: Vec<String> = env::args().collect();
    // 1
    // dbg!(args);

    // 2
    // let query = &args[1];
    // let file_path = &args[2];
    
    // 3
    // let (query, file_path) = parse_config(&args);
    // println!("Searching for {query}");
    // println!("In file {file_path}");
    // let contents = fs::read_to_string(file_path)
    //     .expect("Should have been able to read the file");

    // 4
    // let config = parse_config(&args);
    
    // 6
    //let config = Config::new(&args);

    // 10
    // let config = Config::build(&args).unwrap_or_else(|err| {
    //     println!("Problem parsing arguments: {err}");
    //     process::exit(1);
    // });
       
    let config = Config::build(&args).unwrap_or_else(|err| {
        // println!("Problem parsing arguments: {err}");
        eprintln!("Problem parsing arguments: {err}");
        process::exit(1);
    });
    // println!("Searching for {}", config.query);
    // println!("In file {}", config.file_path);

    // 7
    // let contents = fs::read_to_string(config.file_path)
    //     .expect("Should have been able to read the file");
    // println!("With text:\n{contents}");

    // 9
    // run(config);

    // 10
    // if let Err(e) = run(config) {
    //     println!("Application error:{e}");
    //     process::exit(1);
    // }
    if let Err(e) = minigrep::run(config) {
        //println!("Application error:{e}");
        eprintln!("Application error:{e}");
        process::exit(1);
    }
}


// 10
// fn run(config: Config) -> Result<(), Box<dyn Error>> {
//     let contents = fs::read_to_string(config.file_path)?;
//     println!("With text:\n{contents}");
//     Ok(())
// }

// 8
// fn run(config: Config) {
//     let contents = fs::read_to_string(config.file_path)
//         .expect("Should have been able to read the file");
//     println!("With text:\n{contents}");
// }

// 10
// struct Config {
//     query: String,
//     file_path: String,
// }

// impl Config {
//     // 5
//     // fn new(args: &[String]) -> Config {
//     //     let query = args[1].clone();
//     //     let file_path = args[2].clone();

//     //     Config {query, file_path}
//     // }

//     // 6
//     // fn new(args: &[String]) -> Config {
//     //     if args.len() < 3 {
//     //        panic!("not enough arguments!") 
//     //     }
//     //     let query = args[1].clone();
//     //     let file_path = args[2].clone();

//     //     Config {query, file_path}
//     // }

//     fn build(args: &[String]) -> Result<Config, &'static str> {
//         if args.len() < 3 {
//             return Err("not enough arguments!");
//         }
//         let query = args[1].clone();
//         let file_path = args[2].clone();

//         Ok(Config {query, file_path})
//     }
// }

//3
// fn parse_config(args: &[String]) -> (&str, &str) {
//     let query = &args[1];
//     let file_path = &args[2];

//     (query, file_path)
// }

// 4
// fn parse_config(args: &[String]) -> Config {
//     let query = args[1].clone();
//     let file_path = args[2].clone();

//     Config {query, file_path}
// }
